//按照国际象棋的规则，皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。
//
// n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上，并且使皇后彼此之间不能相互攻击。
//
// 给你一个整数 n ，返回所有不同的 n 皇后问题 的解决方案。
//
//
//
// 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案，该方案中 'Q' 和 '.' 分别代表了皇后和空位。
//
//
//
//
//
// 示例 1：
//
//
//输入：n = 4
//输出：[[".Q..","...Q","Q...","..Q."],["..Q.","Q...","...Q",".Q.."]]
//解释：如上图所示，4 皇后问题存在两个不同的解法。
//
//
// 示例 2：
//
//
//输入：n = 1
//输出：[["Q"]]
//
//
//
//
// 提示：
//
//
// 1 <= n <= 9
//
//
// Related Topics 数组 回溯 👍 1803 👎 0


import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<List<String>> result=new ArrayList<>();
        char[][] board=new char[n][n];
        for (char[] row:board) {
            Arrays.fill(row,'.');
        }
        backTracking(result,board,0);
        return  result;
     }

     public void backTracking( List<List<String>> result ,   char[][] board,int row){
        if(board.length==row){
            result.add(createBoard(board));
            return;
        }
         for (int col = 0; col < board.length; col++) {
            if(isValid(board,row,col)){
                board[row][col]='Q';
                backTracking(result,board,row+1);
                board[row][col]='.';
            }
         }
     }
     public boolean isValid(char[][] board,int row,int col){
        int n=board.length;
         for (int i = 0; i <row ; i++) {
                if(board[i][col]=='Q')
                    return false;
         }

         for (int i = row-1,j=col-1; i >=0&&j>=0 ; i--,j--) {
             if (board[i][j]=='Q') {
                 return  false;
             }
         }

         for (int i = row-1,j=col+1; i >=0&&j<n ; i--,j++) {
             if (board[i][j]=='Q') {
                 return  false;
             }
         }

         return  true;
     }

     public List<String> createBoard(char[][] board){
        List<String> soluntion=new ArrayList<>();
         for (char[] row:board) {
            soluntion.add(String.valueOf(row));
         }
         return  soluntion;
     }
}
//leetcode submit region end(Prohibit modification and deletion)
